import java.awt.Graphics;
import java.io.Serializable;

/**
 * @uml.dependency supplier="Tamanho"
 */
public class Retangulo extends Desenhavel implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6278576548909098146L;

	/**
	 * 
	 */


	/**
	 * @uml.property name="pontoSuperiorEsquerdo"
	 */
	private Coordenada pontoSuperiorEsquerdo;

	/**
	 * @uml.property name="coordenada"
	 * @uml.associationEnd inverse="retangulo:Coordenada"
	 */
	private Coordenada coordenada;

	/**
	 * @uml.property name="retanguloListener"
	 * @uml.associationEnd inverse="retangulo:RetanguloListener"
	 */
	private RetanguloListener retanguloListener;
	private ISelecaoListener selecaoListener;

	private IPontosListener pontoListener;
	/**
	 * @uml.property name="tamanho"
	 * @uml.associationEnd inverse="retangulo:Tamanho"
	 */
	private Tamanho tamanho;

	/**
	 */

	public Retangulo(Coordenada pontoSuperiorEsquerdo, Tamanho tamanho) {
		this.pontoSuperiorEsquerdo = pontoSuperiorEsquerdo;
		this.tamanho = tamanho;
		System.out.println("Eu sou do tamanho Altura:" + tamanho.getAltura());
		System.out.println("Eu sou do tamanho Largura:" + tamanho.getLargura());
	}

	public void setSelecaoListener(ISelecaoListener selecaoListener) {
		this.selecaoListener = selecaoListener;
	}

	public void setPontoListener(IPontosListener pontoListener) {
		this.pontoListener = pontoListener;
	}

	/**
	 */
	public Retangulo(Coordenada pontoSuperiorEsquerdo,
			Coordenada pontoInferiorDireito) {
		this.pontoSuperiorEsquerdo = pontoSuperiorEsquerdo;
		this.tamanho = new Tamanho(pontoInferiorDireito.getX()
				- pontoSuperiorEsquerdo.getX(), pontoInferiorDireito.getY()
				- pontoSuperiorEsquerdo.getY());

	}

	/**
	 * Getter of the property <tt>pontoSuperiorEsquerdo</tt>
	 * 
	 * @return Returns the pontoSuperiorEsquerdo.
	 * @uml.property name="pontoSuperiorEsquerdo"
	 */
	public Coordenada getPontoSuperiorEsquerdo() {
		return pontoSuperiorEsquerdo;
	}

	/**
	 * Setter of the property <tt>pontoSuperiorEsquerdo</tt>
	 * 
	 * @param pontoSuperiorEsquerdo
	 *            The pontoSuperiorEsquerdo to set.
	 * @uml.property name="pontoSuperiorEsquerdo"
	 */
	public void setPontoSuperiorEsquerdo(Coordenada pontoSuperiorEsquerdo) {
		this.pontoSuperiorEsquerdo = pontoSuperiorEsquerdo;
		if (retanguloListener != null)
			retanguloListener.retanguloAlterado();

		if (selecaoListener != null)
			selecaoListener.selecaoAlterada();
		if(pontoListener!= null)
			pontoListener.PontoAlterado();
	
	}

	/**
	 */
	public Coordenada getCentro() {
		return new Coordenada(pontoSuperiorEsquerdo.getX()
				+ tamanho.getAltura() / 2, pontoSuperiorEsquerdo.getY()
				+ tamanho.getLargura() / 2);
	}

	/**
	 */
	public boolean contem(Coordenada coordenada) {
		return (coordenada.getX() >= pontoSuperiorEsquerdo.getX()
				&& coordenada.getX() <= getPontoInferiorDireito().getX()
				&& coordenada.getY() >= pontoSuperiorEsquerdo.getY() && coordenada
				.getY() <= getPontoInferiorDireito().getY());
	}

	/**
	 * Getter of the property <tt>coordenada</tt>
	 * 
	 * @return Returns the coordenada.
	 * @uml.property name="coordenada"
	 */
	public Coordenada getCoordenada() {
		return coordenada;
	}

	/**
	 * Setter of the property <tt>coordenada</tt>
	 * 
	 * @param coordenada
	 *            The coordenada to set.
	 * @uml.property name="coordenada"
	 */
	public void setCoordenada(Coordenada coordenada) {
		this.coordenada = coordenada;
	}

	/**
	 * Getter of the property <tt>pontoInferiorDireito</tt>
	 * 
	 * @return Returns the pontoInferiorDireito.
	 * @uml.property name="pontoInferiorDireito"
	 */
	public Coordenada getPontoInferiorDireito() {
		return new Coordenada(pontoSuperiorEsquerdo.getX()
				+ tamanho.getAltura(), pontoSuperiorEsquerdo.getY()
				+ tamanho.getLargura());
	}

	/**
	 * Setter of the property <tt>pontoInferiorDireito</tt>
	 * 
	 * @param pontoInferiorDireito
	 *            The pontoInferiorDireito to set.
	 * @uml.property name="pontoInferiorDireito"
	 */
	public boolean setPontoInferiorDireito(Coordenada pontoInferiorDireito) {
		tamanho.setAltura(Math.max(0, pontoInferiorDireito.getX()
				- pontoSuperiorEsquerdo.getX()));
		tamanho.setLargura(Math.max(0, pontoInferiorDireito.getY()
				- pontoSuperiorEsquerdo.getY()));

		if (retanguloListener != null) {
			retanguloListener.retanguloAlterado();

		}
		if (selecaoListener != null) {
			selecaoListener.selecaoAlterada();
		}
		if(pontoListener!= null)
			pontoListener.PontoAlterado();
		return true;
	}

	public boolean setPontoOeste(Coordenada pontoOeste) {
		tamanho.setAltura(Math.max(0,
				pontoOeste.getX() - pontoSuperiorEsquerdo.getX()));

		if (retanguloListener != null)
			retanguloListener.retanguloAlterado();

		if (selecaoListener != null)
			selecaoListener.selecaoAlterada();
		if (pontoListener != null)
			pontoListener.PontoAlterado();

		return true;
	}

	public void setPontoSul(Coordenada pontoSul) {
		// TODO Auto-generated method stub
		tamanho.setLargura(Math.max(0,
				pontoSul.getY() - pontoSuperiorEsquerdo.getY()));
		if (retanguloListener != null)
			retanguloListener.retanguloAlterado();

		if (selecaoListener != null)
			selecaoListener.selecaoAlterada();
		if (pontoListener != null)
			pontoListener.PontoAlterado();
	}

	public Tamanho getTamanho() {
		return tamanho;
	}

	public void setTamanho(Tamanho tamanho) {
		this.tamanho = tamanho;
		if (retanguloListener != null)
			retanguloListener.retanguloAlterado();
		if (selecaoListener != null)
			selecaoListener.selecaoAlterada();
		if (pontoListener != null)
			pontoListener.PontoAlterado();
	}

	public void setRetanguloListener(RetanguloListener retanguloListener) {
		this.retanguloListener = retanguloListener;
	}

	/**
		 */
	public void setX(int novox) {
		this.pontoSuperiorEsquerdo.setX(novox);
		if (retanguloListener != null)
			retanguloListener.retanguloAlterado();
		if (selecaoListener != null)
			selecaoListener.selecaoAlterada();
		if (pontoListener != null)
			pontoListener.PontoAlterado();
	}

	/**
			 */
	public void setY(int novoy) {
		this.pontoSuperiorEsquerdo.setY(novoy);
		if (retanguloListener != null)
			retanguloListener.retanguloAlterado();
		if (selecaoListener != null)
			selecaoListener.selecaoAlterada();
		if (pontoListener != null)
			pontoListener.PontoAlterado();
	}

	@Override
	public void desenhar(Graphics graphics) {
	}

	public void setAltura(Coordenada pontoMouseDragged) {
		// TODO Auto-generated method stub
		this.tamanho.setAltura(pontoMouseDragged.getY());
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return null;
	}

}
